drone on GKE 建立

前言

正文

gitlab的安裝方式,參考 71.gitlab on GKE 災害還原筆記

再來是安裝drone的方式,
這邊之前沒寫文件,重試的時候搞了一陣子。

要先知道 runner分成哪幾種,根據你的環境選擇你要的方式。

在drone畫面,基本上都差不多。
有差異的點是再建置時,就直接看圖吧

Drone Runner分成五種,適用於不同的情境

  1. Docker runner :是drone最常見的用法,pineline中的每一個step都起一個獨立的container運行特定任務,本文即是採用docker runner。

    在建置時,會在該runner裡面執行docker,所以當下只會看到runner裡面的cpu跟ram使用量上升。

  2. Kubernetes runner:跟docker runner 的功能相似,只是改成Kubernetes 版本,如果你的服務要搭建在k8s上,就用這個。
    72-fig.2.jpg 72-fig.3.jpg

    選擇kubernetes的版本,再建置時會在當下的叢集建立一個pod,
    然後就會在裡面執行要跑得步驟。

  3. Exec runner:用於你的專案不適合跑在容器內的狀況EX:MacOs專案。

  4. SSH runner:直接以ssh 連線到遠端以default shell 執行pipeline流程,需要使用openssh 7.9 以上版本。

  5. Digital Ocean runner :用於當你的pipeline需要權限可以操作整台虛擬機的情況,且不適合跑在容器內。

角色 功能
用戶 Gitlab
Drone Server Drone 主服務,提供Web界面
Drone Runner 我理解為實現各種操作的適配器,例如ssh、docker、k8s操作
Drone Agent 操作主機 Docker API 的代理程序
Docker Server 主機的 Doker 程序

72-fig.1.jpg

再來就是要佈署 drone server跟 runner了。

Step 1.

首先要到Gitlab,建立oAuth的id 跟token。
切記是在user Setting的 Application,
因為Gitlab是我建的,所以我有另一個Admin的區域,
不是在Admin裡面。

72-fig.4.jpg
72-fig.5.jpg

網頁不要關, Application ID 跟 Secret等等會用到。


Step 2. drone Server


將一些參數改成自己的。

yaml欄位 對應的欄位
DRONE_GITLAB_CLIENT_ID Application ID
DRONE_GITLAB_CLIENT_SECRET Secret
DRONE_SERVER_HOST Callback URL 的domain
DRONE_RPC_SECRET 自行建立,runner的secret需一致
apiVersion: apps/v1
kind: Deployment
metadata:
  name: gke-drone-server
  labels:
    app: drone
    drone: drone-server
    io.kompose.service: drone-server
spec:
  selector:
    matchLabels:
      app: drone
      drone: drone-server
      io.kompose.service: drone-server
  template:
    metadata:
      labels:
            app: drone
            drone: drone-server
            io.kompose.service: drone-server
    spec:
      containers:
      - env:
        - name: DRONE_GITLAB_CLIENT_ID    # OAuth 的 Application ID
          value: 5b2f90188137bab7b1c6959721feb6e55f1137919e5b4b5ce005bd5e15af536a      
        - name: DRONE_GITLAB_CLIENT_SECRET    # OAuth 的 Secret
          value: 4cc261149603b3df864677f5af37b55613f6f4d20dd65fbb3e4f77f0cbca9e15
        - name: DRONE_GITLAB_SERVER       # Gitlab Server
          value: http://35.234.26.234
        - name: DRONE_GIT_ALWAYS_AUTH     # Drone clone 時,是否每次都驗證
          value: "false"
        - name: DRONE_LOGS_COLOR          # Log 啟用顏色辨識
          value: "true"
        - name: DRONE_LOGS_DEBUG          # 選擇是否開啟 debug 模式
          value: "false"
        - name: DRONE_LOGS_PRETY
          value: "false"
        # - name: DRONE_LOGS_TRACE          #開啟log追蹤
        #   value: "true"
        - name: DRONE_RUNNER_CAPACITY     # 表示一次可執行 n 個 job
          value: "3"
        - name: DRONE_SERVER_HOST         # Drone URL,不能加HTTP,解析會在加上HTTP
          value: 14.199.130.26
        - name: DRONE_SERVER_PROTO        # http 或者 https 連線設定
          value: http
        - name: DRONE_TLS_AUTOCERT        # 自動生成 ssl 證書,並接受 https 連線,末認為false
          value: "false"
        - name: DRONE_REGISTRATION_CLOSED # 啟用的話,管理員需在用戶登入前創建用戶
          value: "false"
        - name: DRONE_USER_CREATE         # 建立admin權限的使用者  cli登入用
          value: username:ezio,admin:true
        - name: DRONE_USER_FILTER         # 可操作 Drone 的用戶清單
          value: root,ezio
        - name: DRONE_RPC_SECRET
          value: 824de51510f08498fa770c7798e3cc9e
        image: drone/drone:2
        imagePullPolicy: "Always"
        name: drone-server        
        ports:
        - containerPort: 80
        resources: {}
        volumeMounts:
        - mountPath: /data
          name: drone-server-claim0
      restartPolicy: Always
      serviceAccountName: ""
      volumes:
      - name: drone-server-claim0
        persistentVolumeClaim:
          claimName: gke-drone-server-claim0

如果要其他git的安裝方式請參考 1. 的官方文件
ref.

  1. Drone Gitlab

Step 3-a. drone Runner - Docker Runner


注意 DRONE_RPC_SECRET需與server一致。
這邊會用到 docker.sock,也是因為這個的關係,
才導致這次重新測試。

k8s即將廢棄 Dockershim,改用containerd,
詳細內容就不多說了,有興趣的可參考 (1) 、 (2)

雖然我實測出來的結果,
在containerd的node是可以用的。
有在想是不是因為核心還是 /var/run/docker.sock 個關係,
但隨著後續研究 docker.sock (3),發覺應該是不能用的才對...
但為什麼能用還是搞不懂。但(4)的官方論壇有說,他不擔心這個問題,
實際上還真的沒問題...

補充,
最近把node的 containerd 版本升到 1.20 後,Docker Runner就真的不能用了。應該是早期還在用舊版的containerd,所以才能跑。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: agent
spec:
  selector:
    matchLabels:
      drone: drone-agent
  replicas: 1
  template:
    spec:
      containers:
      - env:
        - name: DRONE_LOGS_DEBUG
          value: "false"
        # - name: DRONE_LOGS_TRACE          #開啟log追蹤
        #   value: "true"
        - name: DRONE_RPC_SECRET
          value: 824de51510f08498fa770c7798e3cc9e
        - name: DRONE_RPC_HOST
          value: 14.199.130.26
        - name: DRONE_RPC_PROTO
          value: "http"
        - name: DRONE_RUNNER_CAPACITY
          value: "3"
        image: drone/drone-runner-docker:1
        imagePullPolicy: ""
        name: drone-agent
        resources: {}
        volumeMounts:
        - mountPath: /var/run/docker.sock
          name: docker-socket
      restartPolicy: Always
      serviceAccountName: ""
      volumes:
      - name: docker-socket
        hostPath:
          path: /var/run/docker.sock

ref.
1. 檢查棄用 Dockershim 對你的影響
2. 棄用 Dockershim 的常見問題
3. [Docker] 掛載 /var/run/docker.sock 的用意?
4. Drone Disscus - Docker plugin & dockershim deprecation // Kubernetes 1.20+

Step 3-b. drone Runner - kubernete Runner


注意 DRONE_RPC_SECRET需與server一致。


kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: drone
rules:
- apiGroups:
  - ""
  resources:
  - secrets
  verbs:
  - create
  - delete
- apiGroups:
  - ""
  resources:
  - pods
  - pods/log
  verbs:
  - get
  - create
  - delete
  - list
  - watch
  - update

---

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: drone
  namespace: default
subjects:
- kind: ServiceAccount
  name: default
  namespace: default
roleRef:
  kind: Role
  name: drone
  apiGroup: rbac.authorization.k8s.io

---


apiVersion: apps/v1
kind: Deployment
metadata:
  name:  gke-drone-agent

  labels:
    app: drone
    drone: drone-agent
    io.kompose.service: drone-agent
spec:
  replicas: 1
  selector:
    matchLabels:
      app: drone
      drone: drone-agent
      io.kompose.service: drone-agent
  template:
    metadata:
      annotations:
        sidecar.istio.io/inject: "true"
      labels:
        app: drone
        drone: drone-agent
        io.kompose.service: drone-agent
    spec:
      containers:
      - name: runner
        image: drone/drone-runner-kube:latest
        ports:
        - containerPort: 3000
        env:
        - name: DRONE_RPC_SECRET
          value: 824de51510f08498fa770c7798e3cc9e
        - name: DRONE_RPC_HOST
          value: 14.199.130.26
        - name: DRONE_RPC_PROTO
          value: "http"
        - name: DRONE_RUNNER_CAPACITY
          value: "3"

ref.
- KUBERNETES Runner

問題排除

  1. 首先碰到的問題是,drone沒有反應,先檢查webhook
    到專案底下的webhook選項,查看錯誤的訊息
    72-fig.6.jpg
    72-fig.7.jpg

因為GKE的防火牆沒開的關係,導致webhook資料丟不過去。


2. drone無法連線到gitlab
72-fig.8.jpg

本來以為是防火牆的關係,但直接連進去pod裡面,呼叫這個網址是正常的。

後來看到 (2) 的討論,我跟他們狀況一樣,應該也是istio造成的。
原以為是 drone server或 runner,有安裝istio的關係,
還特別寫了

template:
  metadata:
    annotations:
      sidecar.istio.io/inject: "false"

來阻止 istio的注入(3)。

後來想了又想,才驚覺,我要取消的應該是整個namespace的istio注入,
因為當新的 pipeline建立時,就已經注入了istio的sidecar,
72-fig.2.jpg

所以要先讓這個namespace通通不能自動注入,
指定其他的deploy會自動注入。
自動注入的規則,請參考 73. istio sidecar 注入規則

  1. 切換namespace,無法佈署

ref.
1. Gitlab Webhooks
2. Drone CI pipeline first step clone failed: Connection refused
3. 安裝 Sidecar
4. istio -Resource Annotations